home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-03-27 | 35.3 KB | 1,027 lines | [TEXT/MPS ] |
- {[a-,body+,h-,o=100,r+,rec+,t=4,u+,#+,j=20/57/1$,n-]}
- { UCalc.p }
- { Copyright © 1986-1990 by Apple Computer, Inc. All rights reserved.}
-
- { This MacApp sample implements a simple spreadsheet }
- { This version, created Christmas Day 1989 by Larry Tesler, uses
- classes TPrimaryScroller and TSecondaryScroller in USynchScroller
- [instead of defining its own TCalcScroller and four AutoScroll methods]
- to achieve synchronous scrolling [instead of near-synchronous scrolling]
- and to enable auto-scrolling during column resizing. }
-
- UNIT UCalc;
-
- INTERFACE
-
- USES
- { • MacApp }
- UMacApp,
-
- { • Building Blocks }
- UPrinting, UGridView, UTEView,
-
- { • Required for this unit's interface }
- Sane,
-
- { • Implementation use }
- ToolUtils, Fonts, Packages
-
- {$IFC qNeedsROM128K}
- , PrintTraps
- {$ELSEC}
- , Printing { Needed because we override printing
- commands }
- {$ENDC}
-
- { • Other Libraries }
- , CalcUtilities, UGrabberTracker, USynchScroller;
-
- CONST
-
- kMaxRows = 120; { Maximum row number }
- kMaxColumns = 64; { Maximum column number }
- kMaxValueLength = 24; { Max. length of a value as a string }
-
- kSignature = 'SS12'; { Application signature. }
- kFileType = 'SF12'; { Data file type. }
-
- kCalcWindowType = 1001; { Resource id of the spreadsheet window }
-
- TYPE
-
- CalcMode = (Manual, Automatic);
-
- RowNumber = 0..kMaxRows; { Zero indicates no row. }
- ColumnNumber = 0..kMaxColumns;
-
- ValueType = Extended;
- DiskValueType = Double; { Extendeds are for internal use only}
- ValueString = STRING[kMaxValueLength];
-
- ValueFormat = DecForm; { Have SANE display numeric values in
- decimal }
-
- KindOfCell = (EmptyCell, ValueCell, TextCell, ErrorCell);
-
- EvalResult = (NoError, MissingRightParen, SelfReference, ErrorCellReference,
- BadNumber, IllegalCharacter, BadCellReference, GarbageAtEnd);
-
- TypeOfSelection = (NoSelection, CellSelection, RowSelection, ColumnSelection,
- AllSelection);
-
- TypeOfStyle = (NoStyle, General, DecimalStyle, NoDecimal, Scientific,
- UnknownStyle);
-
- FormatRecord = RECORD
- fStyle: TypeOfStyle;
- fDigits: 0..255;
- fJustification: SignedByte;
- fFontNumber: 0..255;
- fFontSize: 0..255;
- fFontStyle: Style;
- END;
- FormatPtr = ^FormatRecord;
-
- CalcDocDiskInfo = RECORD { This is the first record in the file }
- dimensions: Rect;
- CalcMode: CalcMode;
- allocatedCells: INTEGER;
- allocatedRows: INTEGER;
- allocatedColumns: INTEGER;
- selectionType: TypeOfSelection;
- editRow: RowNumber;
- editColumn: ColumnNumber;
- END;
-
- RowDiskInfo = RECORD { Info about the document's rows }
- number: INTEGER;
- END;
-
- ColumnDiskInfo = RECORD { Info about the document's columns }
- number: INTEGER;
- format: FormatRecord;
- width: INTEGER;
- END;
-
- CellDiskInfo = RECORD { The document's cells }
- { row/column coordinate read/written separately }
- kind: KindOfCell;
- error: EvalResult;
- value: DiskValueType;
- noOfReferences: INTEGER;
- formula: Str255;
- END;
-
- ScrapInfoRecord = RECORD
- selection: Rect;
- noOfCells: INTEGER;
- END;
-
- CellScrapInfo = RECORD
- { row/column coordinate read/written separately }
- { cell length read/written separately }
- format: FormatRecord;
- formula: Str255;
- END;
-
- {--------------------------------------------------------------------------------------------------}
- TCalcApplication = OBJECT (TApplication)
-
- PROCEDURE TCalcApplication.ICalcApplication(itsFileType: OSType);
- { Initializes the Application }
-
- PROCEDURE TCalcApplication.AboutToLoseControl(convertClipboard: BOOLEAN); OVERRIDE;
- { Override to reset Edit menu items for incoming DAs }
-
- FUNCTION TCalcApplication.DoMakeDocument(itsCmdNumber: cmdNumber): TDocument;
- OVERRIDE;
- { Launches a TCalcDocument }
-
- FUNCTION TCalcApplication.MakeViewForAlienClipboard: TView; OVERRIDE;
- { Handle data that was left in the Clipboard by forces outside the application }
-
- END; { TCalcApplication }
-
- {--------------------------------------------------------------------------------------------------}
- {$IFC qHasForward}
- TCell = OBJECT; FORWARD;
- TRow = OBJECT; FORWARD;
- TColumn = OBJECT; FORWARD;
- TCellsView = OBJECT; FORWARD;
- TRowsView = OBJECT; FORWARD;
- TColumnsView = OBJECT; FORWARD;
- TEntryView = OBJECT; FORWARD;
- TCoordView = OBJECT; FORWARD;
- {$EndC}
-
- TCalcDocument = OBJECT (TDocument)
-
- fCells: ARRAY [1..kMaxRows, 1..kMaxColumns] OF TCell;
- fEditCell: TCell; { the cell being edited (the current
- selection) }
-
- fRows: ARRAY [1..kMaxRows] OF TRow;
- fRowOffset: INTEGER;
-
- fColumns: ARRAY [1..kMaxColumns] OF TColumn;
- fColumnOffset: INTEGER;
- fColumnIsSelected: BOOLEAN; { a column has been selected }
-
- fCellsView: TCellsView; { the view of the cells themselves }
- fRowsView: TRowsView; { the view of the row numbers }
- fColumnsView: TColumnsView; { the view of the column letters }
- fEntryView: TEntryView; { the view for entering/editing cell values
- }
- fCoordView: TCoordView; { the view that shows the selected cell's
- coordinates }
-
- fDimensions: Rect; { the document's dimensions }
- fInUseBounds: Rect; { the area of the document that is in use }
- fCalcMode: CalcMode; { Manual or Automatic recalculation }
- fAllocatedCells: INTEGER; { the number of allocated cells }
- fAllocatedRows: INTEGER; { the number of allocated rows }
- fAllocatedColumns: INTEGER; { the number of allocated columns }
-
- fSelectionType: TypeOfSelection;
-
- fEditRow: RowNumber; { the row of the cell being edited }
- fEditColumn: ColumnNumber; { the column of the cell being edited }
-
- fNoOfRows: INTEGER; { maximum number of rows }
- fNoOfColumns: INTEGER; { maximum number of columns }
-
- { Initialization and termination }
-
- PROCEDURE TCalcDocument.ICalcDocument(dimensions: Rect);
- { Initialize the document }
-
- PROCEDURE TCalcDocument.DoInitialState; OVERRIDE;
- { Initialize allocation counts }
-
- PROCEDURE TCalcDocument.DoMakeViews(forPrinting: BOOLEAN); OVERRIDE;
- { Launch the views which are seen in the document's window }
-
- PROCEDURE TCalcDocument.Free; OVERRIDE;
- { Free the document }
-
- PROCEDURE TCalcDocument.FreeData; OVERRIDE;
- { Delete the cells, rows, and columns }
-
- { Filing OVERRIDES }
-
- PROCEDURE TCalcDocument.DoNeedDiskSpace(VAR dataForkBytes,
- rsrcForkBytes: LONGINT); OVERRIDE;
- { Tells how many bytes of disk space will be required to store the
- data for the document in a file on disk }
-
- PROCEDURE TCalcDocument.DoRead(aRefNum: INTEGER;
- rsrcExists, forPrinting: BOOLEAN); OVERRIDE;
- { Reads in the data from the disk, when a document is Opened or Reverted }
-
- PROCEDURE TCalcDocument.DoWrite(aRefNum: INTEGER;
- makingCopy: BOOLEAN); OVERRIDE;
- { Writes the data to the disk, when a document is Saved }
-
- { Menu handling }
-
- PROCEDURE TCalcDocument.DoSetupMenus; OVERRIDE;
- { Enable menu commands }
-
- FUNCTION TCalcDocument.DoMenuCommand(aCmdNumber: cmdNumber): TCommand; OVERRIDE;
- { Handle menu commands }
-
- { Cell management }
-
- PROCEDURE TCalcDocument.AddCell(theCell: TCell;
- r: RowNumber;
- c: ColumnNumber);
- { Add the cell to the document }
-
- FUNCTION TCalcDocument.CellExists(r: RowNumber;
- c: ColumnNumber): BOOLEAN;
- { Is there a cell object at these coordinates? }
-
- PROCEDURE TCalcDocument.DeleteCell(r: RowNumber;
- c: ColumnNumber);
- { Mark the cell at the given coordinates as deleted }
-
- PROCEDURE TCalcDocument.EachExistingCellDo(cellRange: Rect;
- PROCEDURE
- DoToCell(aCell: GridCell));
- { Perform DoToCell on each cell object in the range }
-
- PROCEDURE TCalcDocument.EditCell;
- { Change the formula of the cell being edited to the string in the entry view }
-
- PROCEDURE TCalcDocument.FreeCell(theCell: TCell);
- { Free the specified cell object }
-
- PROCEDURE TCalcDocument.FreeDeletedCells;
- { Free each cell object that is marked deleted }
-
- FUNCTION TCalcDocument.GetCell(r: RowNumber;
- c: ColumnNumber): TCell;
- { Return the cell object for the given coordinates. }
-
- FUNCTION TCalcDocument.GetExistingCell(r: RowNumber;
- c: ColumnNumber): TCell;
- { Return the cell object or NIL if no cell is allocated for the given coordinates. }
-
- FUNCTION TCalcDocument.IsAutoCalc: BOOLEAN;
- { Evaluates fCalcMode = Automatic }
-
- PROCEDURE TCalcDocument.SetEntry(r: RowNumber;
- c: ColumnNumber);
- { Set the text in the entry view to the formula in the cell at the given
- coordinates }
-
- PROCEDURE TCalcDocument.UndeleteCell(r: RowNumber;
- c: ColumnNumber);
- { If there is a cell at the given coordinates, mark it undeleted }
-
- { Row management }
-
- PROCEDURE TCalcDocument.AddRow(theRow: TRow);
- { Add the row to the document }
-
- PROCEDURE TCalcDocument.EachExistingRowDo(PROCEDURE
- DoToCell(aCell: GridCell));
-
- FUNCTION TCalcDocument.GetRow(r: RowNumber): TRow;
-
- FUNCTION TCalcDocument.RowExists(r: RowNumber): BOOLEAN;
-
- { Column management }
-
- PROCEDURE TCalcDocument.AddColumn(theColumn: TColumn);
- { Add the column to the document }
-
- FUNCTION TCalcDocument.ColumnExists(c: ColumnNumber): BOOLEAN;
-
- PROCEDURE TCalcDocument.EachExistingColumnDo(PROCEDURE
- DoToCell(aCell: GridCell));
-
- FUNCTION TCalcDocument.GetColumn(c: ColumnNumber): TColumn;
-
- { Ranges of cells }
-
- FUNCTION TCalcDocument.CellInRange(r: INTEGER;
- c: INTEGER;
- range: Rect): BOOLEAN;
- { Do the given coordinates fall within the range? }
-
- PROCEDURE TCalcDocument.ConstrainToUsedCells(VAR cellRange: Rect);
- { Shrink the range of cells to exclude unallocated cells, if possible }
-
- PROCEDURE TCalcDocument.DoRecalculate(forceAutomatic: BOOLEAN;
- setDependents: BOOLEAN);
- { Recalculate all cells if fCalcMode = Automatic, otherwise just selected cells }
-
- { Inspecting }
-
- PROCEDURE TCalcDocument.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TCalcDocument }
-
- {--------------------------------------------------------------------------------------------------}
-
- TCalcWindow = OBJECT (TWindow)
-
- PROCEDURE TCalcWindow.IRes(itsDocument: TDocument;
- itsSuperView: TView;
- VAR itsParams: Ptr); OVERRIDE;
- { Create the window from a resource template}
-
- PROCEDURE TCalcWindow.Draw(area: Rect); OVERRIDE;
-
- END; { TCalcWindow }
-
- {--------------------------------------------------------------------------------------------------}
-
- TCellsView = OBJECT (TTextGridView)
- { TCellsView is the view used to show the cell values. }
-
- fCalcDocument: TCalcDocument;
- fLastOptionKey: BOOLEAN; { TRUE if option key down at last idle.
- helps in tracking modifier keys for views
- that care. }
-
- { Initialization and termination }
-
- PROCEDURE TCellsView.ICellsView(itsDocument: TCalcDocument;
- forClipboard: BOOLEAN;
- itsParent: TView);
- { Initialize the view }
-
- PROCEDURE TCellsView.IRes(itsDocument: TDocument;
- itsSuperView: TView;
- VAR itsParams: Ptr); OVERRIDE;
- { Create the view from a resource template}
-
- { Commands and menus }
-
- FUNCTION TCellsView.DoMouseCommand(VAR themouse: Point;
- VAR info: EventInfo;
- VAR hysteresis: Point): TCommand; OVERRIDE;
-
- PROCEDURE TCellsView.DoSetupMenus; OVERRIDE;
-
- FUNCTION TCellsView.DoMenuCommand(aCmdNumber: cmdNumber): TCommand; OVERRIDE;
- { Handle menu commands }
-
- FUNCTION TCellsView.DoKeyCommand(ch: Char;
- aKeyCode: INTEGER;
- VAR info: EventInfo): TCommand; OVERRIDE;
-
- { Display and Selection }
-
- PROCEDURE TCellsView.AdornCol(aCol: INTEGER;
- area: Rect); OVERRIDE;
- { Draw a column delimiter ("adornment") in the given area }
-
- PROCEDURE TCellsView.AdornRow(aRow: INTEGER;
- area: Rect); OVERRIDE;
- { Draw a row delimiter in the given area }
-
- FUNCTION TCellsView.DoIdle(phase: IdlePhase): BOOLEAN; OVERRIDE;
- { Checks the state of the option key and decides whether to make the cursor
- need to be reset. We used to use gAlwaysTrackCursor, but this is better. }
-
- FUNCTION TCellsView.DoSetCursor(localPoint: Point;
- cursorRgn: RgnHandle): BOOLEAN; OVERRIDE;
-
- PROCEDURE TCellsView.DrawCell(aCell: GridCell;
- aQDRect: Rect); OVERRIDE;
- { Draw the cell's value, using the proper justification }
-
- PROCEDURE TCellsView.GetVisibleCells(VAR visibleCells: Rect);
- { Return a rectangle giving the cells that are visible }
-
- FUNCTION TCellsView.IsCellVisible(aCell: GridCell): BOOLEAN;
- { Tell whether the specified cell is visible or not }
-
- PROCEDURE TCellsView.PositionAtCell(aCell: GridCell);
- { Redraw the views so that aCell is at the top left corner of the grid }
-
- PROCEDURE TCellsView.ReSelect(cellRegion: RgnHandle);
- { Set the current selection to the given cells }
-
- PROCEDURE TCellsView.ReSelectCell(aCell: GridCell);
- { Set the current selection to the given cell }
-
- PROCEDURE TCellsView.ScrollSelectionIntoView(redraw: BOOLEAN); OVERRIDE;
- { Scroll so that at least the top left cell of the selection is visible }
-
- PROCEDURE TCellsView.SetCell(aCell: GridCell);
-
- PROCEDURE TCellsView.SetSelection(cellsToSelect: RgnHandle;
- extendSelection, highlight,
- select: BOOLEAN); OVERRIDE;
- { Set the current selections to the specified cells. Adjust the entry and
- coordinate views accordingly. }
-
- { Printing OVERRIDES }
-
- FUNCTION TCellsView.DoBreakFollowing(vhs: VHSelect;
- prevBreak: VCoordinate;
- VAR Automatic: BOOLEAN): VCoordinate; OVERRIDE;
-
- {$IFC qDebug}
- PROCEDURE TCellsView.DoDrawPageBreak(vhs: VHSelect;
- whichBreak: INTEGER;
- loc: VCoordinate;
- Automatic: BOOLEAN); OVERRIDE;
- { For debugging printing only, draw lines showing the page breaks. }
- {$ENDC}
-
- PROCEDURE TCellsView.GetPrintExtent(VAR printExtent: VRect); OVERRIDE;
- { Return the area to print, depending on whether the command was Print Selection
- or Print. }
-
- { Clipboard handling }
-
- FUNCTION TCellsView.ContainsClipType(aType: ResType): BOOLEAN; OVERRIDE;
-
- PROCEDURE TCellsView.WriteCalcScrap(calcScrap: Handle);
-
- PROCEDURE TCellsView.WriteTextScrap(textScrap: Handle);
-
- PROCEDURE TCellsView.WriteToDeskScrap; OVERRIDE;
-
- { Inspecting }
-
- PROCEDURE TCellsView.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TCellsView }
-
- {--------------------------------------------------------------------------------------------------}
- TRowsView = OBJECT (TTextGridView)
- { TRowsView is the view used to show the row numbers. Click in this view
- to select an entire row or group of rows. }
-
- fCalcDocument: TCalcDocument;
-
- PROCEDURE TRowsView.IRes(itsDocument: TDocument;
- itsSuperView: TView;
- VAR itsParams: Ptr); OVERRIDE;
- { Create the view from a resource template}
-
- PROCEDURE TRowsView.AdornRow(aRow: INTEGER;
- area: Rect); OVERRIDE;
- { Draw a row delimiter in the given area }
-
- FUNCTION TRowsView.DoMouseCommand(VAR themouse: Point;
- VAR info: EventInfo;
- VAR hysteresis: Point): TCommand; OVERRIDE;
-
- FUNCTION TRowsView.DoSetCursor(localPoint: Point;
- cursorRgn: RgnHandle): BOOLEAN; OVERRIDE;
-
- PROCEDURE TRowsView.DrawCell(aCell: GridCell;
- aQDRect: Rect); OVERRIDE;
-
- PROCEDURE TRowsView.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TRowsView }
-
- {--------------------------------------------------------------------------------------------------}
- TColumnsView = OBJECT (TTextGridView)
- { TColumnsView is used to show the column headers, represented by the letters
- A-BL. Click in this view to select an entire column or group of columns. }
-
- fCalcDocument: TCalcDocument;
-
- PROCEDURE TColumnsView.IRes(itsDocument: TDocument;
- itsSuperView: TView;
- VAR itsParams: Ptr); OVERRIDE;
- { Create the view from a resource template}
-
- PROCEDURE TColumnsView.AdornCol(aCol: INTEGER;
- area: Rect); OVERRIDE;
- { Draw a column delimiter in the given area }
-
- PROCEDURE TColumnsView.CoordToString(coord: INTEGER;
- VAR theString: Str255);
-
- FUNCTION TColumnsView.DoMouseCommand(VAR themouse: Point;
- VAR info: EventInfo;
- VAR hysteresis: Point): TCommand; OVERRIDE;
-
- FUNCTION TColumnsView.DoSetCursor(localPoint: Point;
- cursorRgn: RgnHandle): BOOLEAN; OVERRIDE;
-
- PROCEDURE TColumnsView.DrawCell(aCell: GridCell;
- aQDRect: Rect); OVERRIDE;
-
- PROCEDURE TColumnsView.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- PROCEDURE TColumnsView.ReSelect(cellRegion: RgnHandle);
-
- END; { TColumnsView }
-
- {--------------------------------------------------------------------------------------------------}
- TCalcPrintHandler = OBJECT (TStdPrintHandler)
-
- fCmdNumber: cmdNumber;
-
- PROCEDURE TCalcPrintHandler.CalcViewPerPage(VAR amtPerPage: VPoint); OVERRIDE;
-
- FUNCTION TCalcPrintHandler.DoMenuCommand(aCmdNumber: cmdNumber): TCommand; OVERRIDE;
- { Overridden to handle Print Selection. }
-
- PROCEDURE TCalcPrintHandler.DoSetupMenus; OVERRIDE;
- { Overridden to handle Print Selection. }
-
- END; { TCalcPrintHandler }
-
- {--------------------------------------------------------------------------------------------------}
- TEntryView = OBJECT (TTEView)
- { TEntryView uses TextEdit to display and edit the selected cell's formula. }
-
- fCalcDocument: TCalcDocument;
- fTouched: BOOLEAN;
- fTEditing: BOOLEAN; { TRUE: TextEdit mode }
- fFirstEdit: BOOLEAN; { TRUE: undo to previous string }
- fOldString: Str255; { previous string, for undo/redo }
-
- PROCEDURE TEntryView.IRes(itsDocument: TDocument;
- itsSuperView: TView;
- VAR itsParams: Ptr); OVERRIDE;
-
- FUNCTION TEntryView.DoKeyCommand(ch: Char;
- aKeyCode: INTEGER;
- VAR info: EventInfo): TCommand; OVERRIDE;
-
- FUNCTION TEntryView.DoMakeTypingCommand(ch: Char): TTETypingCommand; OVERRIDE;
- { Actually returns a TCalcTypingCommand }
-
- FUNCTION TEntryView.DoMouseCommand(VAR themouse: Point;
- VAR info: EventInfo;
- VAR hysteresis: Point): TCommand; OVERRIDE;
-
- PROCEDURE TEntryView.DoSetupMenus; OVERRIDE;
-
- PROCEDURE TEntryView.Draw(area: Rect); OVERRIDE;
-
- PROCEDURE TEntryView.EditMode(editing: BOOLEAN);
- { Enter or leave TextEdit mode. In TextEdit mode (fTEditing=TRUE),
- the Undo command causes an undo of the latest TextEdit action;
- in non-TextEdit mode, Undo brings back the previous string (fOldString) }
-
- PROCEDURE TEntryView.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- PROCEDURE TEntryView.GetAsString(VAR theString: Str255);
- { Return the current text as a string }
-
- PROCEDURE TEntryView.InstallSelection(wasActive, beActive: BOOLEAN); OVERRIDE;
-
- PROCEDURE TEntryView.SetEditMode;
- { Enter TextEdit mode and clear the current text }
-
- PROCEDURE TEntryView.SetToString(theString: Str255);
- { Set the current text to theString }
-
- PROCEDURE TEntryView.SwapStrings;
- { Exchange the current text with that saved in fOldString }
-
- END; { TEntryView }
-
- {--------------------------------------------------------------------------------------------------}
- TCoordView = OBJECT (TView)
- { TCoordView is the view used to display the coordinates of the cell which is
- currently selected. }
-
- fCalcDocument: TCalcDocument;
-
- PROCEDURE TCoordView.IRes(itsDocument: TDocument;
- itsSuperView: TView;
- VAR itsParams: Ptr); OVERRIDE;
-
- PROCEDURE TCoordView.Draw(area: Rect); OVERRIDE;
- { Draws the view seen in the window. Every nonblank view MUST override this method }
-
- PROCEDURE TCoordView.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TCoordView }
-
-
- {--------------------------------------------------------------------------------------------------}
- TColumn = OBJECT (TObject)
-
- fNumber: INTEGER;
- fFormat: FormatRecord;
- fOldFormat: FormatRecord; { save original format for Undo }
- fWidth: INTEGER;
-
- PROCEDURE TColumn.Initialize; OVERRIDE;
- { Put the object into a known state from which it may be safely FREEd.
- (and hopefully a usable state) }
-
- PROCEDURE TColumn.IColumn(number: INTEGER);
-
- PROCEDURE TColumn.ReadFromDisk(theRefNum: INTEGER);
-
- PROCEDURE TColumn.WriteToDisk(theRefNum: INTEGER);
-
- PROCEDURE TColumn.ReadFromScrap(theScrap: Handle;
- VAR scrapOffset: LONGINT);
-
- PROCEDURE TColumn.WriteToScrap(theScrap: Handle;
- VAR scrapOffset: LONGINT);
-
- PROCEDURE TColumn.Fields(PROCEDURE DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TColumn }
-
- {--------------------------------------------------------------------------------------------------}
- TRow = OBJECT (TObject)
-
- fNumber: INTEGER;
-
- PROCEDURE TRow.Initialize; OVERRIDE;
- { Put the object into a known state from which it may be safely FREEd.
- (and hopefully a usable state) }
-
- PROCEDURE TRow.IRow(number: INTEGER);
-
- PROCEDURE TRow.ReadFromDisk(theRefNum: INTEGER);
-
- PROCEDURE TRow.WriteToDisk(theRefNum: INTEGER);
-
- PROCEDURE TRow.ReadFromScrap(theScrap: Handle;
- VAR scrapOffset: LONGINT);
-
- PROCEDURE TRow.WriteToScrap(theScrap: Handle;
- VAR scrapOffset: LONGINT);
-
- PROCEDURE TRow.Fields(PROCEDURE DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TRow }
-
- {--------------------------------------------------------------------------------------------------}
- TCell = OBJECT (TObject)
- { TCell describes one element of the spreadsheet grid. }
- fDeleted: BOOLEAN; { Whether the cell has been deleted }
- fCalcDocument: TCalcDocument; { The document I belong to }
- fReferences: TList; { The cells I reference in my formula }
- fDependents: TList; { The cells that reference me }
-
- fRow: RowNumber; { Which row I'm in }
- fColumn: ColumnNumber; { Which column I'm in }
-
- fKind: KindOfCell; { What kind of cell: text, value, empty,
- error }
- fError: EvalResult; { Error code from my latest evaluation }
- fEvaluating: BOOLEAN; { flag for preventing circular reference
- loops }
- fCalculating: BOOLEAN; { flag for preventing self reference loops }
- fValue: ValueType; { My value represented as a number }
- fValueString: ValueString; { My value represented as a string, for
- display }
- fFormula: Str255; { My contents as typed in by the user }
-
- PROCEDURE TCell.Initialize; OVERRIDE;
- { Put the object into a known state from which it may be safely FREEd.
- (and hopefully a usable state) }
-
- PROCEDURE TCell.ICell(owningDocument: TCalcDocument;
- r: RowNumber;
- c: ColumnNumber);
- { Initialize the cell's fields }
-
- FUNCTION TCell.Clone: TObject; OVERRIDE;
- { Create a new cell which is a copy of this cell, except for dependents and
- references }
-
- PROCEDURE TCell.CopyContents(sourceCell: TCell);
- { Copy contents of sourceCell }
-
- PROCEDURE TCell.Free; OVERRIDE;
- { Free my lists and then free me }
-
- PROCEDURE TCell.EvaluateFormula(DoReferences: BOOLEAN);
- { Calculate my value by evaluating fFormula. If DoReferences is TRUE, add any
- cell references in my formula to the fReferences list, and add me to that
- cell's fDependents list. }
-
- PROCEDURE TCell.GetAsString(VAR theString: Str255);
- { Return my formula string }
-
- PROCEDURE TCell.GetValueAsString(VAR theString: Str255);
- { Return a string representation of my value }
-
- PROCEDURE TCell.invalidate;
- { Cause a cell to be marked invalid (in need of re-drawing). }
-
- FUNCTION TCell.IsEmpty: BOOLEAN;
- { Return TRUE if I have no formula or value }
-
- PROCEDURE TCell.SetDeleteState(deleted: BOOLEAN);
- { Mark a cell as deleted or not deleted }
-
- PROCEDURE TCell.SetToString(theString: Str255);
- { Set my formula to theString and recalculate my value if necessary }
-
- PROCEDURE TCell.Recalculate(forceAutomatic: BOOLEAN;
- setDependents: BOOLEAN);
- { Re-evaluate my formula string. If SetDependents is TRUE, put each cell I
- reference in the fReferences list, and put me on her fDependents list. }
-
- PROCEDURE TCell.ValueToString;
- { Fill fValueString with the string representation of my value }
-
- FUNCTION TCell.GetDiskSize(infoRecordOnly: BOOLEAN): INTEGER;
-
- PROCEDURE TCell.ReadFromDisk(theRefNum: INTEGER);
-
- PROCEDURE TCell.WriteToDisk(theRefNum: INTEGER);
-
- PROCEDURE TCell.ReadFromScrap(theScrap: Handle;
- VAR scrapOffset: LONGINT);
-
- PROCEDURE TCell.WriteToScrap(theScrap: Handle;
- VAR scrapOffset: LONGINT);
-
- { Inspecting }
-
- PROCEDURE TCell.Fields(PROCEDURE DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- PROCEDURE TCell.GetInspectorName(VAR inspectorName: Str255); OVERRIDE;
-
- END; { TCell }
-
- {--------------------------------------------------------------------------------------------------}
- TCalcSelectCommand = OBJECT (TCellSelectCommand)
- { TCalcSelectCommand is a command object created to handle mouse movement when you
- click in a TCellsView. }
-
- fCalcDocument: TCalcDocument;
-
- PROCEDURE TCalcSelectCommand.ICalcSelectCommand(itsDocument: TCalcDocument;
- itsView: TGridView;
- theShiftKey, theCmdKey: BOOLEAN);
-
- PROCEDURE TCalcSelectCommand.ComputeNewSelection(VAR clickedCell: GridCell);
- OVERRIDE;
-
- END; { TCalcSelectCommand }
-
- {--------------------------------------------------------------------------------------------------}
- TRowSelector = OBJECT (TCalcSelectCommand)
- { TRowSelector is a command object created to handle mouse movement when you click
- in a TRowsView. }
-
- fCellSelector: TCalcSelectCommand; { command to handle cells view selection }
-
- PROCEDURE TRowSelector.IRowSelector(itsDocument: TCalcDocument;
- itsView: TGridView;
- theShiftKey, theCmdKey: BOOLEAN);
- { Create a TCalcSelectCommand to handle selection in the cells view in parallel
- with selection in our view, the rows view }
-
- PROCEDURE TRowSelector.Free; OVERRIDE;
- { Dispose of our cell selector }
-
- PROCEDURE TRowSelector.ComputeAnchorCell(VAR clickedCell: GridCell); OVERRIDE;
- PROCEDURE TRowSelector.ComputeNewSelection(VAR clickedCell: GridCell); OVERRIDE;
- PROCEDURE TRowSelector.DoIt; OVERRIDE;
- { Perform these operations for the cells view as well as for the rows view }
-
- FUNCTION TRowSelector.TrackMouse(aTrackPhase: TrackPhase;
- VAR anchorPoint, previousPoint, nextPoint: VPoint;
- mouseDidMove: BOOLEAN): TCommand; OVERRIDE;
-
- END; { TRowSelector }
-
- {--------------------------------------------------------------------------------------------------}
- TColumnSelector = OBJECT (TCalcSelectCommand)
- { TColumnSelector is a command object created to handle mouse movement when you
- click in a TColumnsView. }
-
- fCellSelector: TCalcSelectCommand; { command to handle cells view selection }
-
- PROCEDURE TColumnSelector.IColumnSelector(itsDocument: TCalcDocument;
- itsView: TGridView;
- theShiftKey, theCmdKey: BOOLEAN);
- { Create a TCalcSelectCommand to handle selection in the cells view in parallel with
- selection in our view, the column headers }
-
- PROCEDURE TColumnSelector.Free; OVERRIDE;
- { Dispose of our cell selector }
-
- PROCEDURE TColumnSelector.ComputeAnchorCell(VAR clickedCell: GridCell); OVERRIDE;
- PROCEDURE TColumnSelector.ComputeNewSelection(VAR clickedCell: GridCell); OVERRIDE;
- PROCEDURE TColumnSelector.DoIt; OVERRIDE;
- { Perform these operations for the cells view as well as for the column headers }
-
- FUNCTION TColumnSelector.TrackMouse(aTrackPhase: TrackPhase;
- VAR anchorPoint, previousPoint,
- nextPoint: VPoint;
- mouseDidMove: BOOLEAN): TCommand; OVERRIDE;
-
- END; { TColumnSelector }
-
- {--------------------------------------------------------------------------------------------------}
- TColumnFormatter = OBJECT (TCommand)
- { TColumnFormatter is a command object created to change the style or justification
- of a column. It is not undoable. }
-
- fCalcDocument: TCalcDocument;
- fSelection: RgnHandle; { columns selected for formatting }
-
- PROCEDURE TColumnFormatter.IFormatter(itsDocument: TCalcDocument;
- itsCommand: INTEGER);
-
- PROCEDURE TColumnFormatter.Free; OVERRIDE;
-
- PROCEDURE TColumnFormatter.DoIt; OVERRIDE;
- PROCEDURE TColumnFormatter.UndoIt; OVERRIDE;
- PROCEDURE TColumnFormatter.RedoIt; OVERRIDE;
-
- PROCEDURE TColumnFormatter.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TColumnFormatter }
-
- {--------------------------------------------------------------------------------------------------}
- TColumnSizer = OBJECT (TCommand)
- { TColumnSizer is a command object created to handle mouse movement when you click
- on the boundary between two columns. }
-
- fCalcDocument: TCalcDocument;
- fCellsView: TCellsView;
- fLeftEdge: INTEGER;
-
- fColumn: TColumn;
- fNewWidth: INTEGER;
- fOldWidth: INTEGER; { remember previous width for Undo }
-
- PROCEDURE TColumnSizer.IColumnSizer(itsDocument: TCalcDocument;
- c: ColumnNumber);
-
- FUNCTION TColumnSizer.TrackMouse(aTrackPhase: TrackPhase;
- VAR anchorPoint, previousPoint, nextPoint: VPoint;
- mouseDidMove: BOOLEAN): TCommand; OVERRIDE;
-
- PROCEDURE TColumnSizer.TrackFeedback(anchorPoint, nextPoint: VPoint;
- turnItOn, mouseDidMove: BOOLEAN); OVERRIDE;
-
- PROCEDURE TColumnSizer.TrackConstrain(anchorPoint, previousPoint: VPoint;
- VAR nextPoint: VPoint); OVERRIDE;
-
- PROCEDURE TColumnSizer.DoIt; OVERRIDE;
-
- PROCEDURE TColumnSizer.UndoIt; OVERRIDE;
-
- PROCEDURE TColumnSizer.RedoIt; OVERRIDE;
-
- PROCEDURE TColumnSizer.SetColumnWidth(newWidth: INTEGER);
-
- PROCEDURE TColumnSizer.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TColumnSizer }
-
- {--------------------------------------------------------------------------------------------------}
- TCalcTypingCommand = OBJECT (TTETypingCommand)
- { We define our own typing command in order to remember which cell the typing was
- performed in. Then if the user makes another selection we can undo/redo the
- correct cell. }
-
- fCellsView: TCellsView;
- fTargetCell: GridCell; { cell selected when command was created }
-
- PROCEDURE TCalcTypingCommand.ITETypingCommand(itsTEView: TTEView;
- itsFirstChar: Char); OVERRIDE;
- { Initialize the command object. Save the current cell selection for later
- Undo/Redo }
-
- PROCEDURE TCalcTypingCommand.AddCharacter(aChar: Char); OVERRIDE;
- { Overridden to keep text visible when it overflows the entry view's box }
-
- PROCEDURE TCalcTypingCommand.UndoIt; OVERRIDE;
- { Undo the typing in the target cell }
-
- PROCEDURE TCalcTypingCommand.RedoIt; OVERRIDE;
- { Redo the typing in the target cell }
-
- PROCEDURE TCalcTypingCommand.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TCalcTypingCommand }
-
- {--------------------------------------------------------------------------------------------------}
- TCellEditCommand = OBJECT (TCommand)
- { TCellEditCommand is a command object created to handle the cCopy, cCut, and cClear
- menu commands. }
-
- fCalcDocument: TCalcDocument;
- fSelection: RgnHandle; { cells selected when command was created }
-
- PROCEDURE TCellEditCommand.ICellEditCommand(itsDocument: TCalcDocument;
- itsCommand: INTEGER);
- { Initialize the command object. Save the current cell selection for later
- Undo/Redo }
-
- PROCEDURE TCellEditCommand.Free; OVERRIDE;
- { Clean up our stuff }
-
- PROCEDURE TCellEditCommand.DoIt; OVERRIDE;
- { Edit the currently selected cells }
-
- PROCEDURE TCellEditCommand.UndoIt; OVERRIDE;
- { Undo the edit of the cells }
-
- PROCEDURE TCellEditCommand.RedoIt; OVERRIDE;
- { Redo the edit of the cells }
-
- PROCEDURE TCellEditCommand.Commit; OVERRIDE;
- { Commit the edit of the cells }
-
- PROCEDURE TCellEditCommand.CopySelection;
- { Copy the currently selected cell(s) into the clipboard }
-
- PROCEDURE TCellEditCommand.DeleteSelection;
- { Delete the currently selected cell(s) }
-
- PROCEDURE TCellEditCommand.RestoreSelection;
- { Restore the deleted cells }
-
- PROCEDURE TCellEditCommand.ReSelect;
- { Change the selection back to what it was when this command was created }
-
- PROCEDURE TCellEditCommand.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TCellEditCommand }
-
- {--------------------------------------------------------------------------------------------------}
- TCellPasteCommand = OBJECT (TCommand)
- { TCellPasteCommand is a command object created to handle the cPaste menu command. }
-
- fClipDocument: TCalcDocument;
- fCalcDocument: TCalcDocument;
- fSelection: RgnHandle; { cells selected when command was created }
- fReplacedCells: TList; { the cells we pasted over }
-
- PROCEDURE TCellPasteCommand.ICellPasteCommand(itsDocument: TCalcDocument);
- { Initialize the command object }
-
- PROCEDURE TCellPasteCommand.Free; OVERRIDE;
- { We don' need this command no more }
-
- PROCEDURE TCellPasteCommand.DoIt; OVERRIDE;
- { Paste to the currently selected cells. Save this selection for Undo/Redo. }
-
- PROCEDURE TCellPasteCommand.UndoIt; OVERRIDE;
- { Undo the paste of the cells }
-
- PROCEDURE TCellPasteCommand.RedoIt; OVERRIDE;
- { Redo the paste of the cells }
-
- PROCEDURE TCellPasteCommand.UpdateViews;
- { Redisplay the affected cells }
-
- PROCEDURE TCellPasteCommand.Fields(PROCEDURE
- DoToField(fieldName: Str255;
- fieldAddr: Ptr;
- fieldType: INTEGER)); OVERRIDE;
-
- END; { TCellPasteCommand }
-
- IMPLEMENTATION
- {$I UCalc.inc1.p}
- END.
-